import { LinRouter } from 'lin-mizar';
import { AddContentValidator, DeleteContentValidator, EditContentValidator } from '../../validators/content';
import { ContentService } from '../../service/content';
import { groupRequired } from '../../middleware/jwt';
import { logger } from '../../middleware/logger';

const contentApi = new LinRouter({
  prefix: '/v1/content'
});
// 插入数据 权限定制 行为日志
contentApi.linPost(
  'addContent',
  '/',
  {
    // 标注所需权限
    permission: '添加期刊内容',
    // 标注权限模块
    module: '内容管理',
    // 标注权限是否挂载倒全局
    mount: true
  },
  // 指定接口级别
  // (1).loginRequired 凡是登录即可访问，不需要赋予权限
  // (2).groupRequired 登录且被授予权限才可访问
  // (3).adminRequired 只有超级管理员才可访问
  groupRequired,
  logger('{user.username}用户新增了期刊内容'), // 行为日志
  async ctx => {
  // 1.数据校验
    const cv = await new AddContentValidator().validate(ctx);
    // return ctx.json(cv);
    // 2.执行业务逻辑
    // 3.插入数据库
    await ContentService.addContent(cv.get('body'));
    // 4.返回成功
    ctx.success({
      mag: '期刊内容新增成功'
    });
  });
// 查询数据
contentApi.get('/', async ctx => {
  const cv = await ContentService.getContentList();
  ctx.json(cv);
});
// 修改数据
contentApi.linPut(
  'editContent',
  '/:id',
  {
    // 标注所需权限
    permission: '修改期刊内容',
    // 标注权限模块
    module: '内容管理',
    // 标注权限是否挂载倒全局
    mount: true
  },
  groupRequired,
  logger('{user.username}修改了期刊内容'),
  async ctx => {
    const v = await new EditContentValidator().validate(ctx);
    const id = v.get('path.id');
    const params = v.get('body');
    await ContentService.editContent(id, params);
    ctx.success({
      msg: '修改成功'
    });
  });
// 删除数据
contentApi.linDelete(
  'deleteContent',
  '/:id',
  {
    // 标注所需权限
    permission: '删除期刊内容',
    // 标注权限模块
    module: '内容管理',
    // 标注权限是否挂载倒全局
    mount: true
  },
  groupRequired,
  logger('{user.username}删除了期刊内容'),
  async ctx => {
    const cv = await new DeleteContentValidator().validate(ctx);
    const id = cv.get('path.id');
    const type = cv.get('query.type');
    await ContentService.deleteContent(id, type);
    ctx.success({
      msg: '删除成功'
    });
  });
module.exports = { contentApi };
